/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ourpkr.model.joueur.bestiale;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import ourpkr.model.joueur.Joueur;
import java.util.*;
import java.io.*;
import java.util.regex.*;
import ourpkr.OurPkrApp;
import ourpkr.model.Carte;
import ourpkr.model.EnsembleCartes;

/**
 *
 * @author mscebalt
 */
public class Bestiale extends Joueur{

    
    public Bestiale(String nom, int nb)
    {
        pcs = new PropertyChangeSupport(this);
        this.nom = nom;
        this.number = nb;
        prop = new Properties();
        propFlop = new Properties();
        InputStream in;
        first = true;
        
        try{            
            in = getClass().getResourceAsStream("/ourpkr/model/joueur/bestiale/resources/first.properties");
            prop.load(in);
            propFlop.load(getClass().getResourceAsStream("/ourpkr/model/joueur/bestiale/resources/poker.properties"));
        }
        catch(Exception dtc){
            dtc.printStackTrace();
        }
        
         OurPkrApp.getApplication().getPc().pcs.addPropertyChangeListener("tour", new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
        
             OurPkrApp.getApplication().getPc().getTour().pcs.addPropertyChangeListener("progress",new PropertyChangeListener() {

                public void propertyChange(PropertyChangeEvent evt) {
                    first = true;
                }
            });
            }
        });
    }
    
    @Override
    public int joue() {
        setPlaying(true);
        if(OurPkrApp.getApplication().getPc().getTour().getProgress().equals("1er Tour d'encheres")){
            tourEnchere();
        }
        else if(!OurPkrApp.getApplication().getPc().getTour().getProgress().equals("River")){
            notRiver();
        }
        setPlaying(false);
        return getWhatToDo();
    }
    
    private void tourEnchere(){
        double proba = getProbaMain();
        if(proba > 50 && (fortune + getMiseCourante() - 2 * miseMiniTour() >= 0 ) && first){
            first = false;
            setWhatToDo(2*miseMiniTour());
        }
        else if(proba > 25 && (fortune + getMiseCourante() - miseMiniTour()) >= 0){
            setWhatToDo(0);
        }
        else {
            setWhatToDo(-1);
        }        
    }
    
    private void notRiver(){
        double proba = 0.0;
        String probCart = "";        
        String c1 = transfToAProbaCart(main.carteAt(0));
        String c2 = transfToAProbaCart(main.carteAt(1));
        int big ;
        int small;
        double p = 0.0;
        EnsembleCartes tapis = OurPkrApp.getApplication().getPc().getTour().getTapis();
        if(main.carteAt(0).getValeur() > main.carteAt(1).getValeur() || main.carteAt(0).getValeur() == 1){
            probCart = c1+c2;
            big = main.carteAt(0).getValeur();
            small = main.carteAt(1).getValeur();
        }
        else {
            probCart = c2+c1;
            big = main.carteAt(1).getValeur();
            small = main.carteAt(0).getValeur();
        }
        if(main.carteAt(0).getCouleur() == main.carteAt(1).getCouleur()){
            probCart += "s";
        }
        
        int tmp = 0;
        int tmp1 = 0;
        for(int i = 0 ; i<tapis.getSize();i++){
            if(big == tapis.carteAt(i).getValeur()) tmp++;
        }
        if(tmp == 1){
            //Verifier le 2ème chiffre...
            //paire forte
            proba = getProbaFlop(probCart,1);
        }
        else if(tmp == 2){
            //brelan
            proba = getProbaFlop(probCart,5);
        }
        else if(tmp == 3){
            //carre
            proba = getProbaFlop(probCart,9);
        }
        
        for(int i = 0 ; i<tapis.getSize();i++){
            if(small == tapis.carteAt(i).getValeur()) tmp1++;
        }
        if(tmp1 == 1 && tmp==0){
            //paire faible
            p = getProbaFlop(probCart,2);
        }
        else if(tmp1==1 && tmp==1){
            //double paire
            p = getProbaFlop(probCart,3);
        }
        else if((tmp1==2 && tmp==1) || (tmp1 == 1 && tmp == 2)){
            //full
            p = getProbaFlop(probCart,4);
        }
        proba = (proba > p?proba:p);
        
        //Calcul pour la couleur
        tmp = 0;
        for(int i = 0 ; i < tapis.getSize();i++){
            if(tapis.carteAt(i).getCouleur() == main.carteAt(0).getCouleur()){
                tmp++;
            }
        }
        if(tmp == 3){
            //couleur
            p = getProbaFlop(probCart,6);
        }        
        proba = (proba > p?proba:p);
        for(int i = 0 ; i < tapis.getSize();i++){
            if(tapis.carteAt(i).getCouleur() == main.carteAt(1).getCouleur()){
                tmp++;
            }
        }
        if(tmp == 3){
            //couleur
            p = getProbaFlop(probCart,6);
        }    
       proba = (proba > p?proba:p);
        //Calcul pour la suite
        Vector<Carte> tap = new Vector();
        boolean end = false;
        tap.add(tapis.carteAt(0));
        for(int i = 1; i<tapis.getSize();i++){
            for(int j = 0; j < tap.size() && !end ;j++){
                if((tapis.carteAt(i).getValeur() < tap.elementAt(j).getValeur())){
                    tap.add(j,tapis.carteAt(i));
                    end = true;
                }  
            }
            end = false;
        }
        int diff = 0;
        boolean good = true;
        for(int i = tap.size()-1;i>0 && good == true;i--){
            diff = tap.get(i).getValeur() - tap.get(i-1).getValeur();
            if(diff == 1){
                good = true;
            }
            else{
                good = false;                
            }
        }
        //Calcul de proba pour la suite
        if(good) p = getProbaFlop(probCart,8);
        proba = (proba > p?proba:p);
        
        if(proba < 50){
            setWhatToDo(-1);
        }
        else if (proba < 70){
            setWhatToDo(0);
        }
        else {
            if(first){
                first = false;
                setWhatToDo(2*miseMiniTour());
            }
        }    
                
    }
    
    protected double getProbaMain(){
        String c1 = transfToAProbaCart(main.carteAt(0));
        String c2 = transfToAProbaCart(main.carteAt(1));
        String probCart = "";
        if(main.carteAt(0).getValeur() > main.carteAt(1).getValeur() || main.carteAt(0).getValeur() == 1){
            probCart = c1+c2;
        }
        else {
            probCart = c2+c1;
        }
        if(main.carteAt(0).getCouleur() == main.carteAt(1).getCouleur()){
            probCart += "s";
        }
        return getProba(probCart,OurPkrApp.getApplication().getPc().getNbJoueurs());
    }
           
    protected double getProba(String cards, int joueurs){
        Pattern p;
        String toComp = "";
        for(int i = 0 ; i< 8; i++){
            toComp += "([0-9]+.[0-9]);";
        }
        toComp += "([0-9]+.[0-9])";
        p = Pattern.compile(toComp);
        try {
            Matcher m = p.matcher(prop.getProperty(cards));
            if(m.matches()){
               return (new Double(m.group(joueurs-1))).doubleValue();
            }
        }
        catch(Exception e){ e.printStackTrace();}
        return 0.0;
    }
           
    protected double getProbaFlop(String cards, int nb){
        Pattern p;
        String toComp = "";
        for(int i = 0 ; i< 10; i++){
            toComp += "([0-9]+.[0-9]);";
        }
        toComp += "([0-9]+.[0-9])";
        p = Pattern.compile(toComp);
        try {
            Matcher m = p.matcher(propFlop.getProperty(cards));
            if(m.matches()){
               return (new Double(m.group(nb))).doubleValue();
            }
        }
        catch(Exception e){ e.printStackTrace();}
        return 0.0;
    }
    
    protected String transfToAProbaCart(Carte c){        
        String result = "";
        switch(c.getValeur()){
            case 1 :
                result += "A";
                break;
            case 11 :
                result += "J";
                break;
            case 12 :
                result += "Q";
                break;
            case 13 :
                result += "K";
                break;   
            case 10 :
                result += "T";
                break;
            default :
                result += c.getValeur();                
        }
        return result;
    }
            
    public static void main(String[] args) {
        Bestiale b = new Bestiale("Georges", 5);
    }
    
    private Properties prop;
    private Properties propFlop;
    private boolean first = true;
}
